package com.xinyue.fileOperate;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class FileOperateUtil {

	/**
	 * 获得文件
	 * 如果有，则返回源文件。如果没有，则创建新文件并返回。
	 * @param fileUrl
	 * @return
	 */
	public File getFile(String fileDir) {
		File file = new File(fileDir);
		//如果文件不存在，则创建新文件。
		if(!file.exists()) {
			try {
				file.getParentFile().mkdirs();
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return file;
	}
	
	/**
	 * 删除源文件内容，并新增信息
	 * @param info
	 * @return
	 */
	public boolean writeFile(File file, String info) {
		boolean flag = false;
		
		FileWriter fw = null;
		PrintWriter pw = null;
		try {
			//true：表示读取源文件的内容，在其上追加
			//false：表示删除源文件的内容。在其上新建
			fw = new FileWriter(file, false);
			pw = new PrintWriter(new BufferedWriter(fw));
			
			pw.print(info);
			pw.flush();//缓存内容写入文件
			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				fw.close();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return flag;
	}
	/**
	 * 在文件末尾追加内容。并且内容之间选择性换行。
	 * @param info
	 * @return
	 */
	public boolean writeFile(File file, List<String> info, boolean println) {
		boolean flag = false;
		
		FileWriter fw = null;
		PrintWriter pw = null;
		try {
			fw = new FileWriter(file, false);
			pw = new PrintWriter(new BufferedWriter(fw));
			//读取list中的内容，并将其写入文件
			for(int i = 0; i < info.size(); i++) {
				//是否换行
				if(println) {
					pw.println(info.get(i));
				}else {
					pw.print(info.get(i));
				}
			}
			
			pw.flush();
			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				fw.close();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return flag;
	}
	
	/**
	 * 在文件末尾追加内容
	 * @param info
	 * @return
	 */
	public boolean writeFileBack(File file, String info) {
		boolean flag = false;
		
		FileWriter fw = null;
		PrintWriter pw = null;
		try {
			//true：表示读取源文件的内容，在其上追加
			//false：表示删除源文件的内容。在其上新建
			fw = new FileWriter(file, true);
			pw = new PrintWriter(new BufferedWriter(fw));
			
			pw.print(info);
			pw.flush();//缓存内容写入文件
			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				fw.close();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return flag;
	}
	/**
	 * 在文件末尾追加内容。并且内容之间选择性换行。
	 * @param info
	 * @return
	 */
	public boolean writeFileBack(File file, List<String> info, boolean println) {
		boolean flag = false;
		
		FileWriter fw = null;
		PrintWriter pw = null;
		try {
			fw = new FileWriter(file, true);
			pw = new PrintWriter(new BufferedWriter(fw));
			//读取list中的内容，并将其写入文件
			for(int i = 0; i < info.size(); i++) {
				//是否换行
				if(println) {
					pw.println(info.get(i));
				}else {
					pw.print(info.get(i));
				}
			}
			
			pw.flush();
			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				fw.close();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return flag;
	}
	
	/**
	 * 给文件添加换行符
	 * @param file
	 * @return
	 */
	public boolean writeFilePrintln(File file) {
		boolean flag = false;
		
		FileWriter fw = null;
		PrintWriter pw = null;
		try {
			fw = new FileWriter(file, true);
			pw = new PrintWriter(new BufferedWriter(fw));
			pw.println();
			pw.flush();//缓存内容写入文件
			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				fw.close();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return flag;
	}
	
	
	/**
	 * 读取文件，返回文件缓存对象
	 * @param file
	 * @return
	 */
	public BufferedReader readFile(File file) {
		
		//读取信息文件，分配信息文件信息
		BufferedReader br = null;
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return br;
	}
	
	/**
	 * 读取文件，返回文件内容
	 * @param file
	 * @return
	 */
	public String readFileForString(File file) {
		
		//读取信息文件，分配信息文件信息
		BufferedReader br = null;
		FileInputStream fis = null;
		StringBuffer info = new StringBuffer();
		try {
			fis = new FileInputStream(file);
			br = new BufferedReader(new InputStreamReader(fis));
			String date = "";
			while((date = br.readLine()) != null) {
				info.append(date);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fis.close();
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return info.toString();
	}
	
	/**
	 * 读取文件，返回文件内容
	 * @param file
	 * @return
	 */
	public List<String> readFileForList(File file) {
		
		//读取信息文件，分配信息文件信息
		BufferedReader br = null;
		FileInputStream fis = null;
		List<String> info = new ArrayList<String>();
		try {
			fis = new FileInputStream(file);
			br = new BufferedReader(new InputStreamReader(fis));
			String date = "";
			while((date = br.readLine()) != null) {
				info.add(date);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fis.close();
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return info;
	}
	
	/**
	 * 删除文件
	 * @param fileDir
	 * @return
	 */
	public boolean deleteFile(String fileDir) {
		
		boolean flag = false;
		
		File file = new File(fileDir);
		//如果文件存在，则删除。
		file.renameTo(file);
		if(file.exists()) {
			flag = file.delete();
		}else{
			flag = true;
		}
		
		return flag;
	}
	
	/**
	 * 复制文件
	 * @param 被复制文件路径，复制文件路径
	 * @return
	 */
	public boolean copyFile(String fileDir, String newDir) {
		return copyFile(null, fileDir, newDir);
	}
	
	/**
	 * 复制文件
	 * @param 被复制文件，复制文件路径
	 * @return
	 */
	public boolean copyFile(File file, String newDir) {
		return copyFile(file, null, newDir);
	}
	
	/**
	 * 私有类 复制文件
	 * @param 被复制文件，被复制文件路径，复制文件路径
	 * @return
	 */
	private boolean copyFile(File file, String fileDir, String newDir) {
		
		boolean flag = false;
		if(file == null) {
			file = new File(fileDir);
		}
		File newFile = new File(newDir);
		//如果文件不存在，则创建新文件。
		if(!newFile.exists()) {
			try {
				newFile.getParentFile().mkdirs();
				newFile.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		FileOutputStream fout = null;
		BufferedOutputStream bos = null;
		
		if(file.exists()) {
			try {
				fis = new FileInputStream(file);
				bis = new BufferedInputStream(fis);
				fout = new FileOutputStream(newDir);
				bos = new BufferedOutputStream(fout);
				//复制
				byte[] bytes = new byte[1024];  
				while (bis.read(bytes) > 0) {  
					bos.write(bytes);  
					bos.flush();
				}
				
				flag = true;
			} catch (Exception e) {
				e.printStackTrace();
			}finally {
				try {
					fis.close();
					bis.close();
					fout.close();
					bos.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}else {
			System.out.println("复制文件不存在！");
		}
		
		return flag;
	}
}
